package 网络编程2套接字.回显程序;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIp;
    private int serverPort;
    //客户端一启动的时候,就需要知道服务器的ip和端口.
    //但是服务器一启动的时候,是无法知道客户端的ip和端口的.直到客户端的请求到了,服务器才知道对应客户端的ip和端口
    //参数的ip和port指的是,服务器的ip和端口
    public UdpEchoClient(String serverIp,int serverPort) throws SocketException {
        this.serverIp = serverIp;
        this.serverPort = serverPort;
        //客户端在构造这个Socket的时候,不需要指定端口好
        //尤其是不能把serverPort指定进去
        //--
        //如果当前DatagramPacket构造方法中没有指定端口的话,就相当于操作系统会分配一分空闲的端口号,给客户端来使用
        //为啥客户端这里可以随机生成,服务器就必须手动指定??
        //客户端需要明确知道服务器的端口是啥,才能通信
        this.socket = new DatagramSocket();
    }
    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
       while(true){
           //1.从标准输入读入一个数据
           System.out.println("->");
           String request = scanner.nextLine();
           if(request.equals("exit")){
               System.out.println("exit");
               return;
           }
           //2.把字符串构造成一个UDP请求
           //这个DatagramPacket中,既要包含具体的数据,又要包含这个数据发给谁?
           DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
                   InetAddress.getByName(serverIp),serverPort);
           socket.send(requestPacket);
           DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
           socket.receive(responsePacket);
           //4.显示这个结果
           String response = new String(responsePacket.getData(),0,responsePacket.getLength());
           String log = String.format("req:%s;resp:%s",request,response);
           System.out.println(log);
       }
    }

    public static void main(String[] args) throws IOException {
        //"127.0.0.1"环回IP就表示主机本身,当前客户端和服务器在同一台主机上.所以客户端中写的服务器IP就是127.0.0.1即可
        UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);
        client.start();
    }
}
